home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / System / collapse.c next >
Encoding:
Text File  |  1986-04-19  |  4.1 KB  |  227 lines  |  [TEXT/MACA]

  1. /* --------------- Collapse --------------- 
  2.  *
  3.  * Make the windows on the screen collapse.
  4.  * Written in Aztec C.
  5.  * 
  6.  * Author:   Fons Rademakers, Nikhef-h/CERN
  7.  * Version:  29-oct-1985
  8.  * Revision:
  9.  *
  10.  */
  11.  
  12. #asm
  13. main
  14.     dc.w  $6400        ;ctl-enable, need time and locked in mem.
  15.     dc.w  0          ;update as often as possible
  16.     dc.w  $0001        ;don't react on any specific event
  17.     dc.w  0            ;no menu
  18.  
  19.     dc.w  open_-main    ;open routine
  20.     dc.w  nop_-main        ;prime routine
  21.     dc.w  control_-main    ;control routine
  22.     dc.w  nop_-main        ;status routine
  23.     dc.w  close_-main     ;close routine
  24.  
  25. title_
  26.     dc.b  8
  27.     dc.b  "Collapse"
  28.     ds    0              ;for alignment
  29.  
  30.     public   _Uend_,_Dorg_,_Cend_
  31.  
  32. save_
  33.     lea     main+(_Uend_-_Dorg_)+(_Cend_-main),a4    ;set up globals
  34.     move.l  a0,Pbp_                    ;save pb pointer
  35.     move.l  a1,Dp_                    ;save DCE pointer
  36.     rts
  37.  
  38. restore_
  39.     move.l  Pbp_,a0
  40.     rts
  41. #endasm
  42.  
  43. #define     _DRIVER
  44. #define  SMALL_MEM
  45. #include <quickdraw.h>
  46. #include <memory.h>
  47. #undef   SMALL_MEM
  48. #include <event.h>
  49. #include <pb.h>
  50. #include <desk.h>
  51.  
  52. #define NULL  (0L)
  53.  
  54. #define BASE1 512        /* Mac screen size in x direction */
  55. #define BASE2 342        /* Mac screen size in y direction */
  56.  
  57. #define SP (*(struct storage **)Dp->dCtlStorage)
  58.  
  59. DCEPtr  Dp;
  60. ParmBlkPtr  Pbp;
  61.  
  62. Rect wind_rect = {0, 0, 0, 0};
  63.  
  64. struct storage {
  65.     GrafPtr flowport;            /* the flow grafport */
  66.     Pattern gray;
  67.     short   portspace[54];       /* space for the flowport */
  68.     short   y;
  69. };
  70.  
  71. open()
  72. {
  73.     register WindowPtr wp;
  74.     register struct DCE *dp;
  75.     register struct storage *sp;
  76.     extern char title[];
  77.     struct windowpeek {
  78.         GrafPort port;
  79.         int      windowKind;
  80.     };
  81.     short    x, i;
  82.  
  83.     save();
  84.     dp = Dp;
  85.     if (dp->dCtlWindow == NULL) {
  86.         HLock(dp->dCtlStorage = NewHandle((long) sizeof(struct storage)));
  87.         sp = SP;
  88.         /* create an invisible window */
  89.         dp->dCtlWindow =         
  90.         wp = NewWindow(NULL, &wind_rect, title, FALSE, plainDBox, -1L, FALSE, 
  91. NULL);
  92.         ((struct windowpeek *)wp)->windowKind = dp->dCtlRefNum;
  93.         /* allocate space for new flowport */
  94.         &sp->flowport->device = sp->portspace;
  95.         OpenPort(sp->flowport);
  96.         /* set start y value */
  97.         sp->y = 20;
  98.         /* gray pattern */
  99.         StuffHex(sp->gray, "\PAA55AA55AA55AA55");
  100.         /* set the background pattern to gray */
  101.         BackPat(sp->gray);
  102.         /* set the pen pattern to gray */
  103.         PenPat(sp->gray);
  104.  
  105.         HUnlock(dp->dCtlStorage);
  106.     }
  107.     restore();
  108.     return(0);
  109. }
  110.  
  111.  
  112. close()
  113. {
  114.     register struct DCE *dp;
  115.  
  116.     save();
  117.     dp = Dp;
  118.     /* get rid of the allocated space for the window */
  119.     DisposeWindow(dp->dCtlWindow);
  120.     dp->dCtlWindow = NULL;
  121.     DisposHandle(dp->dCtlStorage);
  122.     restore();
  123.     return(0);
  124. }
  125.  
  126.  
  127. nop()
  128. {
  129.     return(0);
  130. }
  131.  
  132.  
  133.  
  134.  
  135. control()
  136. {
  137.     register struct DCE *dp;
  138.     register struct storage *sp;
  139.     short     x, i;
  140.     short     xdest, ydest;
  141.     Rect      destrect;
  142.     RgnHandle dummyrgn;
  143.  
  144.     save();
  145.     dp = Dp;
  146.     HLock(dp->dCtlStorage);
  147.     sp = SP;
  148.     switch (Pbp->u.cp.csCode) {
  149.     case accRun:        /* time to flow the screen */
  150.         SetPort(sp->flowport);
  151.         if (sp->y <= BASE2) {
  152.             for (i = 1; i <= 7; i++) {
  153.                 dummyrgn = NewRgn();
  154.                 x = jrand(BASE1);
  155.                 SetRect(&destrect, x, sp->y, min(x+150, BASE1), rand(sp->y, BASE2));
  156.                 xdest = rand(-3, 3);
  157.                 ydest = rand(1, 4);
  158.                 ScrollRect(&destrect, xdest, ydest, dummyrgn);
  159.                 DisposeRgn(dummyrgn);
  160.             }
  161.             MoveTo(0, sp->y);
  162.             LineTo(BASE1, sp->y);
  163.             sp->y++;
  164.         } else
  165.             sp->y = 20;
  166.         break;  /* end case */
  167.     }
  168.     HUnlock(dp->dCtlStorage);
  169.     restore();
  170.     return(0);
  171. }
  172.  
  173.  
  174. /* Return random number uniformly distributed on [min,max].
  175.  * Note that Random() delivers a value on [-32768,32767]. */
  176. rand(min, max)
  177. int min, max;
  178. {
  179.     float ran;
  180.  
  181.     ran = (max - min + 1.0)*(float)abs(Random())/32768.0 + min;
  182.     return((ran < 0) ? --ran : ran);
  183. }
  184.  
  185.  
  186. /* Return random number, on base [0, base>, with quadratic emphasis
  187.  * round base/2. */
  188. jrand(base)
  189. int base;
  190. {
  191.     float x, ran;
  192.  
  193.     x = (float)abs(Random())/32767.0;   /* random number uniformly on [0, 
  194. 1> */
  195.     ran = 2.0*(float)base*x*(1.0 - x);
  196.     if (x >= 0.5)
  197.         ran = (float)base - ran;
  198.     return(ran);
  199. }
  200.  
  201.  
  202.  
  203. /* Return absolute value of an integer */
  204. abs(n)
  205. int n;
  206. {
  207.     return((n > 0) ? n : -n);
  208. }
  209.  
  210.  
  211.  
  212. /* Return the max integer */
  213. max(a, b)
  214. int a, b;
  215. {
  216.     return((a > b) ? a : b);
  217. }
  218.  
  219.  
  220. /* Return the min integer */
  221. min(a, b)
  222. int a, b;
  223. {
  224.     return((a < b) ? a : b);
  225. }
  226.  
  227.